
//c语言 中printf函数就是⼀个不定参函数，在函数内
//部可以根据格式化字符串中格式化字符分别获取不同的参数进⾏数据的格式化。

//不定参宏函数
#include <iostream>
#include <cstdarg>
#define LOG(fmt, ...) printf("[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)

int main()
{
 LOG("%s-%s", "hello", "⽐特就业课");
 return 0;
}


//C⻛格不定参函数
#include <iostream>
#include <cstdarg>
void printNum(int count, ...) {
    va_list al;//参数列表指针
   va_start(al, count);//让al指向count参数之后的第⼀个可变参数
   for (int i = 0; i < count; i++) {
      int num = va_arg(al, int);//从可变参数中取出⼀个整形参数
      std::cout << num << std::endl;
 }
     va_end(al);//清空可变参数列表--其实是将al置空
}
int main()
{
 printNum(3, 11,22,33);
 printNum(5, 44,55,66,77,88);
 return 0;
}


#include <iostream>
#include <cstdarg>
//格式化输出字符串
 void myprintf(const char *fmt, ...) {   
 //int vasprintf(char **strp, const char *fmt, va_list ap);
    char *res;
     va_list al;
     va_start(al, fmt);
    int len = vasprintf(&res, fmt, al);
    va_end(al);
    std::cout << res << std::endl;
    free(res);
}

     int main()
    {
        myprintf("%s-%d", "⼩明", 18);
        return 0;
    }



//C++⻛格不定参函数
#include <iostream>
#include <cstdarg>
#include <memory>
#include <functional>
void xprintf() {
    std::cout << std::endl;
}

template<typename T, typename ...Args>  
void xprintf(const T &value, Args &&...args) {
    std::cout << value << " ";
    if ((sizeof ...(args)) > 0) {
    xprintf(std::forward<Args>(args)...);  //完美转发
 }else {
    xprintf();
 }
}

 int main()
{
    xprintf("⽐特");
    xprintf("⽐特", 666);
    xprintf("⽐特", "就业课", 666);
    return 0;
}